﻿// Cpp_Course_09_reference.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>

int main()
{
    std::cout << "Hello World!\n";
    {

        int x = 0;  //纯数值变量
        int* p = &x;        //指针保存 int x的内存地址   32位电脑内为4个字节
        int& r = x;     //r 表示 x   ，现在r x 的值都是 0  ，相当于r作为x这个值类型的另一个别名，起名之后不得用于其他变量 ，而底部实现依旧是指针
        int x2 = 5;

        r = x2;     // r代表了x   此时 x2将其值5赋值给r 就是5赋值给了x  所以  r=x=5 ， r与x为一样大小是编译器的假象 其实r就是一个指针
        int& r2 = r;
    }


    {

        double x = 0;
        double* p = &x;         //p是x的指针
        double& r = x;          //r作为x的别名

        std::cout<<  sizeof(x)  <<std::endl;            //x数据大小
        std::cout<<  sizeof(p)  <<std::endl;            //当前指针大小
        std::cout<<  sizeof(r)  <<std::endl;            //r的数据大小  应该和x是一样大的  但是编译器的假象  

        std::cout << p << std::endl;            //地址
        std::cout << *p << std::endl;       
        std::cout << x << std::endl;
        std::cout << r << std::endl;
        std::cout << &x << std::endl;
        std::cout << &r << std::endl;



        //定义结构体  四个int  长度16
        typedef struct Stag
        {
            int a, b, c, d;
        }S;

        S s;
        S& rs = s;
        std::cout << sizeof(s) << std::endl;
        std::cout << sizeof(rs) << std::endl;
        std::cout << &s << std::endl;
        std::cout << &rs << std::endl;



        //reference 是个漂亮的指针变量   
        //常常用于函数传递参数   底层是个指针所以速度快  而且写法和值传递一样 非常讨喜

    }

}

// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门使用技巧: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件，或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来，若要再次打开此项目，请转到“文件”>“打开”>“项目”并选择 .sln 文件
